# 例子：
# 我和小田（观察者）去面试（观察者行为）
# 面试公司（被观察者）发送了offer（被观察者行为）
# 就会通知我和小田

# 观察者
# 观察者行为
# 被观察者
# 被观察者行为
# 关联两者的类

from abc import ABCMeta, abstractmethod


# 观察者接口 -- 公司给我发offer，我就能去上班了
class Observer(metaclass=ABCMeta):
    @abstractmethod
    def receive(self):
        pass


# 观察者实现类 -- 我和小田拿到offer
class ObserverRealize(Observer):
    def __init__(self, name):
        self.name = name

    def receive(self):
        print("%s收到了offer" % self.name)


# 被观察者接口
class ByObserver():
    def send(self, observer_list):
        raise NotImplementedError


# 被观察者实现类
class ByObserverRealize(ByObserver):
    def send_offer(self, observer_list):
        for observer in observer_list:
            observer.receive()


# 观察者和被观察者都构建好了，接下来关联他们
class Relevance(ByObserver):
    def __init__(self, ByObserverRealize):
        self.ByObserverRealize = ByObserverRealize
        self.list1 = []

    # 添加观察者
    def AddObserver(self, observer):
        self.list1.append(observer)

    # 取消观察者
    def CancelObserver(self, observer):
        self.list1.remove(observer)

    # 发送offer
    def send_offer(self, observer_list=None):
        self.ByObserverRealize.send_offer(self.list1)


# 测试
observer1 = ObserverRealize("小张")  # 观察者分别为我和小田
observer2 = ObserverRealize("小田")
ObserverTwo = ByObserverRealize()
relevance = Relevance(ObserverTwo)  # 关联她们
relevance.AddObserver(observer1)  # 添加小张
relevance.AddObserver(observer2)  # 添加小田
relevance.send_offer()  # 发送offer
